home *** CD-ROM | disk | FTP | other *** search
/ Experimental BBS Explossion 3 / Experimental BBS Explossion III.iso / c / xlib20b.zip / PMPRINT.ASM < prev    next >
Assembly Source File  |  1993-08-24  |  20KB  |  497 lines

  1. ;                Protected-Mode Screen Management Procedures.
  2. ;
  3. ;
  4. ;   DS assumed to be set to flat-model data selector.  Screen address assumed at
  5. ;B8000H.  Cursor position address assumed at 450H.
  6. ;   A full explanation of each procedure is provided above the procedure.  The
  7. ;following is a brief summary of all included procedures:
  8. ;
  9. ;Procedure     Description
  10. ;PCH           Print ASCII character in AL at cursor
  11. ;CRLF          Issue carriage return and line feed
  12. ;SCRLUP        Scoll screen up
  13. ;SPC           Print AL spaces at cursor
  14. ;GETCSR        Get cursor position in AX.  AH = row, AL = column
  15. ;SETCSR        Set cursor position at (row,col) = (AH,AL)
  16. ;CLS           Clear screen
  17. ;PSTR          Print zero terminated ASCII string at ES:EBX
  18. ;PCSSTR        Print zero terminated ASCII string at CS:EBX
  19. ;PHW           Print hexadecimal WORD in AX
  20. ;PHD           Print hexadecimal DWORD in EAX
  21. ;PUW           Print unsigned WORD in AX as decimal
  22. ;PUD           Print unsigned DWORD in EAX as decimal
  23. ;PSW           Print signed WORD in AX as decimal
  24. ;PSD           Print signed DWORD in EAX as decimal
  25. ;FPST          Print ST of FPU using format in AX.  AH = characters to left of
  26. ;              decimal.  AL = characters to right of decimal.
  27.  
  28. SCRNBASEADR    EQU            000B8000H
  29. CURPOS         EQU            00000450H
  30.  
  31. ;Print ASCII code in AL at cursor.
  32. PCH            PROC NEAR
  33.                PUSH           EBX
  34.                PUSH           EDX
  35.                MOV            EDX,DWORD PTR DS:[CURPOS]     ;Cursor (row,col) in (DH,DL)
  36.                PUSH           EDX                           ;Push cursor position
  37.                XOR            EBX,EBX
  38.                MOV            BL,DH                         ;Multiply row by 160
  39.                SHL            BL,2
  40.                ADD            BL,DH
  41.                SHL            EBX,5
  42.                AND            EDX,0FFH                      ;Clear all but column
  43.                ADD            DL,DL                         ;Multiply column by 2
  44.                ADD            EBX,EDX
  45.                ADD            EBX,SCRNBASEADR
  46.                POP            EDX                           ;POP cursor position
  47.                MOV            [EBX],AL
  48.                INC            DL                            ;Increment column
  49.                CMP            DL,79
  50.                JBE            RCDCURSOR
  51.                XOR            DL,DL                         ;Move to zero column of next row
  52.                INC            DH                            ;Move to next row
  53. RCDCURSOR:     MOV            WORD PTR DS:[CURPOS],DX       ;Assume row is valid
  54.                CMP            DH,24
  55.                JA             DOSCROLL
  56. EXIT:          POP            EDX
  57.                POP            EBX
  58.                RET
  59. DOSCROLL:      CALL           SCRLUP
  60.                JMP            EXIT
  61. PCH            ENDP
  62.  
  63. ;Clear cursor to end of line and issue CRLF.  Scroll up if necessary.
  64. CRLF           PROC NEAR
  65.                PUSH           EAX
  66.                PUSH           EBX
  67.                PUSH           ECX
  68.                MOV            EAX,DWORD PTR DS:[CURPOS]
  69.                PUSH           EAX                           ;PUSH cursor position
  70.                XOR            EBX,EBX
  71.                MOV            BL,AH                         ;Multiply row by 160
  72.                SHL            BL,2
  73.                ADD            BL,AH
  74.                SHL            EBX,5
  75.                AND            EAX,0FFH                      ;Clear all but column
  76.                MOV            CL,80
  77.                SUB            CL,AL                         ;Get number of bytes to clear in CL
  78.                ADD            AL,AL                         ;Multiply column by 2
  79.                ADD            EBX,EAX
  80.                ADD            EBX,SCRNBASEADR
  81.                MOV            AL,32
  82. CLREOL:        MOV            [EBX],AL                      ;Clear to end of line
  83.                ADD            EBX,2
  84.                DEC            CL
  85.                JNZ            CLREOL
  86.                POP            EAX                           ;POP cursor position
  87.                INC            AH                            ;Increment row
  88.                CMP            AH,24
  89.                JA             DOSCROLL
  90.                XOR            AL,AL                         ;Set column to zero
  91.                MOV            WORD PTR DS:[CURPOS],AX
  92. EXIT:          POP            ECX
  93.                POP            EBX
  94.                POP            EAX
  95.                RET
  96. DOSCROLL:      CALL           SCRLUP
  97.                JMP            EXIT
  98. CRLF           ENDP
  99.  
  100. ;Scroll entire screen up one line and leave cursor at start of line 24.
  101. SCRLUP         PROC NEAR
  102.                PUSH           EAX
  103.                PUSH           EBX
  104.                PUSH           ECX
  105.                MOV            EBX,SCRNBASEADR
  106.                MOV            ECX,960                       ;960 = (80*24*2)/4 (DWORDS to scroll)
  107. SCROLLLOOP:    MOV            EAX,[EBX+160]
  108.                MOV            [EBX],EAX
  109.                ADD            EBX,4
  110.                DEC            ECX
  111.                JNZ            SCROLLLOOP
  112.                MOV            CL,80
  113.                MOV            AL,32
  114. CLR24:         MOV            [EBX],AL                      ;Clear line 24
  115.                ADD            EBX,2
  116.                DEC            CL
  117.                JNZ            CLR24
  118. EXIT:          MOV            WORD PTR DS:[CURPOS],1800H    ;Set cursor to bottom line in zero column
  119.                POP            ECX
  120.                POP            EBX
  121.                POP            EAX
  122.                RET
  123. SCRLUP         ENDP
  124.  
  125. ;Print AL spaces at cursor.
  126. SPC            PROC NEAR
  127.                OR             AL,AL
  128.                JZ             EXIT
  129.                PUSH           EAX
  130.                MOV            AH,AL
  131.                MOV            AL,32
  132. PRINTSPC:      CALL           PCH
  133.                DEC            AH
  134.                JNZ            PRINTSPC
  135.                POP            EAX
  136. EXIT:          RET
  137. SPC            ENDP
  138.  
  139. ;Set cursor location at (row,col) = (AH,AL).
  140. SETCSR         PROC NEAR
  141.                CMP            AH,24                         ;Do not allow row greater than 24
  142.                JBE            CHKCOL
  143.                MOV            AH,24
  144. CHKCOL:        CMP            AL,79                         ;Do not allow column greater than 79
  145.                JBE            SETCURSOR
  146.                MOV            AL,79
  147. SETCURSOR:     MOV            WORD PTR DS:[CURPOS],AX
  148.                RET
  149. SETCSR         ENDP
  150.  
  151. ;Get cursor position in AX.
  152. GETCSR         PROC NEAR
  153.                MOV            AX,WORD PTR DS:[CURPOS]
  154.                RET
  155. GETCSR         ENDP
  156.  
  157. ;Clear screen and leave cursor at (0,0) position.
  158. CLS            PROC NEAR
  159.                PUSH           EAX
  160.                PUSH           EBX
  161.                PUSH           ESI
  162.                MOV            EBX,SCRNBASEADR
  163.                MOV            ESI,1999
  164.                MOV            AL,32
  165. DOCLS:         MOV            [EBX+2*ESI],AL
  166.                DEC            ESI
  167.                JNS            DOCLS
  168.                MOV            WORD PTR DS:[CURPOS],0H
  169.                POP            ESI
  170.                POP            EBX
  171.                POP            EAX
  172.                RET
  173. CLS            ENDP
  174.  
  175. ;Print ASCIIZ string at address in ES:EBX.
  176. PSTR           PROC NEAR
  177.                PUSH           EAX
  178.                PUSH           EBX
  179. CHARLOOP:      MOV            AL,ES:[EBX]
  180.                OR             AL,AL                         ;See if at end of string
  181.                JZ             EXIT
  182.                CALL           PCH
  183.                INC            EBX
  184.                JMP            CHARLOOP
  185. EXIT:          POP            EBX
  186.                POP            EAX
  187.                RET
  188. PSTR           ENDP
  189.  
  190. ;Print ASCIIZ string at address CS:EBX.
  191. PCSSTR         PROC NEAR
  192.                PUSH           EAX
  193.                PUSH           EBX
  194. CHARLOOP:      MOV            AL,CS:[EBX]                   ;See if at end of string
  195.                OR             AL,AL
  196.                JZ             EXIT
  197.                CALL           PCH
  198.                INC            EBX
  199.                JMP            CHARLOOP
  200. EXIT:          POP            EBX
  201.                POP            EAX
  202.                RET
  203. PCSSTR         ENDP
  204.  
  205. ;Print hexadecimal WORD in AX.
  206. PHW            PROC NEAR
  207.                PUSH           EAX
  208.                PUSH           ECX
  209.                PUSH           EDX
  210.                MOV            EDX,EAX
  211.                MOV            CL,4                          ;Print four nibbles
  212. CALCNIBS:      MOV            AL,DL
  213.                AND            AL,0FH
  214.                ADD            AL,48
  215.                CMP            AL,57
  216.                JBE            PUSHDIGIT
  217.                ADD            AL,7
  218. PUSHDIGIT:     PUSH           EAX
  219.                SHR            EDX,4
  220.                DEC            CL
  221.                JNZ            CALCNIBS
  222.                MOV            CL,4
  223. PRNTNIBS:      POP            EAX
  224.                CALL           PCH
  225.                DEC            CL
  226.                JNZ            PRNTNIBS
  227.                POP            EDX
  228.                POP            ECX
  229.                POP            EAX
  230.                RET
  231. PHW            ENDP
  232.  
  233. ;Print hexadecimal DWORD in EAX.
  234. PHD            PROC NEAR
  235.                PUSH           EAX
  236.                PUSH           ECX
  237.                PUSH           EDX
  238.                MOV            EDX,EAX
  239.                MOV            CL,8                          ;Print eight nibbles
  240. CALCNIBS:      MOV            AL,DL
  241.                AND            AL,0FH
  242.                ADD            AL,48
  243.                CMP            AL,57
  244.                JBE            PUSHDIGIT
  245.                ADD            AL,7
  246. PUSHDIGIT:     PUSH           EAX
  247.                SHR            EDX,4
  248.                DEC            CL
  249.                JNZ            CALCNIBS
  250.                MOV            CL,8
  251. PRNTNIBS:      POP            EAX
  252.                CALL           PCH
  253.                DEC            CL
  254.                JNZ            PRNTNIBS
  255.                POP            EDX
  256.                POP            ECX
  257.                POP            EAX
  258.                RET
  259. PHD            ENDP
  260.  
  261. ;Print unsigned WORD in AX as decimal.
  262. PUW            PROC NEAR
  263.                PUSH           EAX
  264.                PUSH           EBX
  265.                PUSH           ECX
  266.                PUSH           EDX
  267.                AND            EAX,0FFFFH
  268.                XOR            CL,CL
  269.                MOV            EBX,10
  270. CALCDIGS:      XOR            EDX,EDX
  271.                DIV            BX
  272.                PUSH           EDX
  273.                INC            CL
  274.                OR             EAX,EAX
  275.                JNZ            CALCDIGS
  276. PRNTDIGS:      POP            EAX
  277.                ADD            AL,48
  278.                CALL           PCH
  279.                DEC            CL
  280.                JNZ            PRNTDIGS
  281.                POP            EDX
  282.                POP            ECX
  283.                POP            EBX
  284.                POP            EAX
  285.                RET
  286. PUW            ENDP
  287.  
  288. ;Print unsigned DWORD in EAX as decimal.
  289. PUD            PROC NEAR
  290.                PUSH           EAX
  291.                PUSH           EBX
  292.                PUSH           ECX
  293.                PUSH           EDX
  294.                XOR            CL,CL
  295.                MOV            EBX,10
  296. CALCDIGS:      XOR            EDX,EDX
  297.                DIV            EBX
  298.                PUSH           EDX
  299.                INC            CL
  300.                OR             EAX,EAX
  301.                JNZ            CALCDIGS
  302. PRNTDIGS:      POP            EAX
  303.                ADD            AL,48
  304.                CALL           PCH
  305.                DEC            CL
  306.                JNZ            PRNTDIGS
  307.                POP            EDX
  308.                POP            ECX
  309.                POP            EBX
  310.                POP            EAX
  311.                RET
  312. PUD            ENDP
  313.  
  314. ;Print signed WORD in AX as decimal.
  315. PSW            PROC NEAR
  316.                PUSH           EAX
  317.                OR             AX,AX
  318.                JNS            PABS
  319.                PUSH           EAX
  320.                MOV            AL,"-"
  321.                CALL           PCH
  322.                POP            EAX
  323.                NEG            AX                            ;Calculate absolute value
  324. PABS:          CALL           PUW                           ;Print absolute value
  325.                POP            EAX
  326.                RET
  327. PSW            ENDP
  328.  
  329. ;Print signed DWORD in EAX as decimal.
  330. PSD            PROC NEAR
  331.                PUSH           EAX
  332.                OR             EAX,EAX
  333.                JNS            PABS
  334.                PUSH           EAX
  335.                MOV            AL,"-"
  336.                CALL           PCH
  337.                POP            EAX
  338.                NEG            EAX                           ;Calculate absolute value
  339. PABS:          CALL           PUD                           ;Print absolute value
  340.                POP            EAX
  341.                RET
  342. PSD            ENDP
  343.  
  344. ;Print ST of FPU using format code in AX.  AH = number of postdecimal characters
  345. ;including sign (if negative).  AL = number of predecimal characters.  Fractions
  346. ;are printed with leading zero provided that AH > 0.  Can print numbers
  347. ;absolutely smaller than 10 ^ 18.  Can print up to 18 predecimal places.  Will
  348. ;fill entire print field with "*" if postdecimal field is too small.  Will fill
  349. ;entire print field with ">" if number absolutely greater than 10 ^ 18.
  350. FPST           PROC NEAR PUBLIC
  351.                LOCAL NOHIDIGITS:DWORD
  352.                LOCAL NOLODIGITS:DWORD
  353.                LOCAL OLDCWORD:WORD
  354.                LOCAL NEWCWORD:WORD
  355.                LOCAL HIDIGITS[10]:BYTE
  356.                LOCAL LODIGITS[10]:BYTE
  357.                PUSH           EAX
  358.                PUSH           ECX
  359.                PUSH           EDX
  360.                PUSH           ESI
  361.                PUSH           EDI
  362.                XOR            ECX,ECX                       ;Save format codes
  363.                MOV            CL,AL
  364.                MOV            NOLODIGITS,ECX
  365.                MOV            CL,AH
  366.                MOV            NOHIDIGITS,ECX
  367.                FLD            ST                            ;See if number of high digits greater than 18
  368.                FABS
  369.                FCOM           QWORD PTR CS:SCALEFAC
  370.                FSTSW          AX
  371.                SAHF
  372.                JAE            OVERFLOW
  373.                FSTCW          OLDCWORD                      ;Set RC to truncate
  374.                MOV            AX,OLDCWORD
  375.                OR             AX,0C00H
  376.                MOV            NEWCWORD,AX
  377.                FLDCW          NEWCWORD
  378.                FLD            ST(1)                         ;Save high digits
  379.                FBSTP          TBYTE PTR HIDIGITS[0]
  380.                FLD            ST                            ;Calculate and save low digits
  381.                FRNDINT
  382.                FLDCW          OLDCWORD
  383.                FSUB
  384.                FMUL           QWORD PTR CS:SCALEFAC
  385.                XOR            AL,AL
  386.                XOR            EDI,EDI
  387.                MOV            ESI,8
  388.                FBSTP          TBYTE PTR LODIGITS[0]
  389. GETHIDIGIT:    IF (@WordSize EQ 4)
  390.                OR             AL,HIDIGITS[ESI]              ;Find first nonzero digit
  391.                ELSE
  392.                OR             AL,HIDIGITS[SI]
  393.                ENDIF
  394.                JNZ            CALCHIORDER
  395.                DEC            ESI
  396.                JNS            GETHIDIGIT
  397.                XOR            ESI,ESI                       ;There are no nonzero high digits
  398.                OR             CL,CL                         ;See if a leading zero can be added to fraction
  399.                JZ             CHKSIGN
  400.                INC            ESI                           ;Add leading zero
  401.                JMP            CHKSIGN
  402. CALCHIORDER:   MOV            EDI,ESI
  403.                INC            ESI                           ;Convert ESI to number of high digits
  404.                ADD            ESI,ESI
  405.                AND            AL,0F0H                       ;See if highest digit is in odd position
  406.                JNZ            CHKSIGN
  407.                DEC            ESI
  408. CHKSIGN:       MOV            DL,HIDIGITS[9]                ;Get sign byte
  409.                OR             DL,DL
  410.                JNS            CALCSPACES
  411.                INC            ESI                           ;Account for "-"
  412. CALCSPACES:    SUB            ECX,ESI                       ;Calculate number of leading spaces
  413.                JB             SMALLFLD
  414.                JE             PRNTSIGN
  415.                MOV            AL," "
  416. PRNTSPACES:    CALL           PCH
  417.                DEC            ECX
  418.                JNZ            PRNTSPACES
  419. PRNTSIGN:      OR             DL,DL
  420.                JNS            PRNTHIDIGITS
  421.                MOV            AL,"-"
  422.                CALL           PCH
  423.                DEC            ESI
  424.                JZ             PRNTDEC
  425. PRNTHIDIGITS:  IF (@WordSize EQ 4)
  426.                MOV            DL,HIDIGITS[EDI]
  427.                ELSE
  428.                MOV            DL,HIDIGITS[DI]
  429.                ENDIF
  430.                TEST           ESI,01H
  431.                JNZ            ODDDIGIT
  432. HIDIGITLOOP:   MOV            AL,DL
  433.                SHR            AL,4
  434.                ADD            AL,48
  435.                CALL           PCH
  436. ODDDIGIT:      MOV            AL,DL
  437.                AND            AL,0FH
  438.                ADD            AL,48
  439.                CALL           PCH
  440.                DEC            EDI
  441.                JS             PRNTDEC
  442.                IF (@WordSize EQ 4)
  443.                MOV            DL,HIDIGITS[EDI]
  444.                ELSE
  445.                MOV            DL,HIDIGITS[DI]
  446.                ENDIF
  447.                JMP            HIDIGITLOOP
  448. PRNTDEC:       MOV            ECX,NOLODIGITS
  449.                OR             ECX,ECX
  450.                JZ             EXIT
  451.                MOV            AL,"."
  452.                CALL           PCH
  453.                MOV            EDI,8
  454. LODIGITLOOP:   IF (@WordSize EQ 4)
  455.                MOV            DL,LODIGITS[EDI]
  456.                ELSE
  457.                MOV            DL,LODIGITS[DI]
  458.                ENDIF
  459.                MOV            AL,DL
  460.                SHR            AL,4
  461.                ADD            AL,48
  462.                CALL           PCH
  463.                DEC            ECX
  464.                JZ             EXIT
  465.                MOV            AL,DL
  466.                AND            AL,0FH
  467.                ADD            AL,48
  468.                CALL           PCH
  469.                DEC            ECX
  470.                JZ             EXIT
  471.                DEC            EDI
  472.                JNS            LODIGITLOOP
  473. EXIT:          POP            EDI
  474.                POP            ESI
  475.                POP            EDX
  476.                POP            ECX
  477.                POP            EAX
  478.                RET
  479. FILLFLD:       MOV            ECX,NOLODIGITS
  480.                OR             ECX,ECX
  481.                JNZ            CALCNOCHARS
  482.                INC            ECX
  483. CALCNOCHARS:   ADD            ECX,NOHIDIGITS
  484. PRNTCHAR:      CALL           PCH
  485.                DEC            ECX
  486.                JNZ            PRNTCHAR
  487.                JMP            EXIT
  488. SMALLFLD:      MOV            AL,"*"
  489.                JMP            FILLFLD
  490. OVERFLOW:      FSTP           ST                            ;Pop absolute value of number
  491.                MOV            AL,">"
  492.                JMP            FILLFLD
  493.                ALIGN          4
  494. SCALEFAC:
  495.                DQ             43ABC16D674EC800H             ;10 ^ 18
  496. FPST           ENDP
  497.